package com.hhxy.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * 用于替代HttpServlet
 * 实现根据请求动态调用方法
 */

public class BaseServlet extends HttpServlet {
    //根据请求的最后一段路径来进行方法分发
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取请求路径
        String uri = req.getRequestURI();//路径：/day15_demo/brand/add    备注：URI是段路径，URL是长路径
//        System.out.println(uri);//测试
        //2、获取最后一个/后面的字符串，它是我们真正要访问的servlet方法
        int index = uri.lastIndexOf('/');//找到最后一个斜杠的索引
        String methodName = uri.substring(index+1);//方法名：brand  备注：不加1是/brand(包左不包右)
//        System.out.println(methodName);//测试

        //3、执行方法（使用反射）
        //3.1 获取BrandServlet的类对象（准确来说谁被访问了，就获取谁的类对象）
        Class<? extends BaseServlet> cls = this.getClass();
        try {
            //3.2 获取方法对象
            Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //3.3 执行方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
